home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / bsf.jar / com / ibm / cs / util / CodeBuffer.class (.txt) next >
Encoding:
Java Class File  |  1999-09-24  |  9.2 KB  |  396 lines

  1. package com.ibm.cs.util;
  2.  
  3. import com.ibm.cf.CodeFormatter;
  4. import java.io.PrintWriter;
  5. import java.io.StringReader;
  6. import java.io.StringWriter;
  7. import java.util.Hashtable;
  8. import java.util.Stack;
  9. import java.util.Vector;
  10.  
  11. public class CodeBuffer {
  12.    private StringWriter fieldDeclSW = new StringWriter();
  13.    private StringWriter methodDeclSW = new StringWriter();
  14.    private StringWriter initializerSW = new StringWriter();
  15.    private StringWriter constructorSW = new StringWriter();
  16.    private StringWriter serviceMethodSW = new StringWriter();
  17.    private PrintWriter fieldDeclPW;
  18.    private PrintWriter methodDeclPW;
  19.    private PrintWriter initializerPW;
  20.    private PrintWriter constructorPW;
  21.    private PrintWriter serviceMethodPW;
  22.    private Stack symbolTableStack;
  23.    private Hashtable symbolTable;
  24.    private Hashtable usedSymbolIndices;
  25.    private ObjInfo finalStatementInfo;
  26.    private CodeBuffer parent;
  27.    private Vector imports;
  28.    private Vector constructorArguments;
  29.    private Vector constructorExceptions;
  30.    private Vector serviceMethodExceptions;
  31.    private Vector implementsVector;
  32.    private String packageName;
  33.    private String className;
  34.    private String serviceMethodName;
  35.    private String extendsName;
  36.    private Class serviceMethodReturnType;
  37.  
  38.    public CodeBuffer() {
  39.       this.fieldDeclPW = new PrintWriter(this.fieldDeclSW);
  40.       this.methodDeclPW = new PrintWriter(this.methodDeclSW);
  41.       this.initializerPW = new PrintWriter(this.initializerSW);
  42.       this.constructorPW = new PrintWriter(this.constructorSW);
  43.       this.serviceMethodPW = new PrintWriter(this.serviceMethodSW);
  44.       this.symbolTableStack = new Stack();
  45.       this.symbolTable = new Hashtable();
  46.       this.usedSymbolIndices = new Hashtable();
  47.       this.symbolTableStack.push(this.symbolTable);
  48.       this.imports = new Vector();
  49.       this.constructorArguments = new Vector();
  50.       this.constructorExceptions = new Vector();
  51.       this.serviceMethodExceptions = new Vector();
  52.       this.implementsVector = new Vector();
  53.       this.className = "Test";
  54.       this.serviceMethodName = "exec";
  55.       this.serviceMethodReturnType = Void.TYPE;
  56.    }
  57.  
  58.    public CodeBuffer(CodeBuffer var1) {
  59.       this.fieldDeclPW = new PrintWriter(this.fieldDeclSW);
  60.       this.methodDeclPW = new PrintWriter(this.methodDeclSW);
  61.       this.initializerPW = new PrintWriter(this.initializerSW);
  62.       this.constructorPW = new PrintWriter(this.constructorSW);
  63.       this.serviceMethodPW = new PrintWriter(this.serviceMethodSW);
  64.       this.symbolTableStack = new Stack();
  65.       this.symbolTable = new Hashtable();
  66.       this.usedSymbolIndices = new Hashtable();
  67.       this.symbolTableStack.push(this.symbolTable);
  68.       this.imports = new Vector();
  69.       this.constructorArguments = new Vector();
  70.       this.constructorExceptions = new Vector();
  71.       this.serviceMethodExceptions = new Vector();
  72.       this.implementsVector = new Vector();
  73.       this.className = "Test";
  74.       this.serviceMethodName = "exec";
  75.       this.serviceMethodReturnType = Void.TYPE;
  76.       this.parent = var1;
  77.    }
  78.  
  79.    public void addFieldDeclaration(String var1) {
  80.       this.fieldDeclPW.println(var1);
  81.    }
  82.  
  83.    public void addMethodDeclaration(String var1) {
  84.       this.methodDeclPW.println(var1);
  85.    }
  86.  
  87.    public void addInitializerStatement(String var1) {
  88.       this.initializerPW.println(var1);
  89.    }
  90.  
  91.    public void addConstructorStatement(String var1) {
  92.       this.constructorPW.println(var1);
  93.    }
  94.  
  95.    public void addServiceMethodStatement(String var1) {
  96.       this.serviceMethodPW.println(var1);
  97.    }
  98.  
  99.    public StringBuffer getFieldBuffer() {
  100.       this.fieldDeclPW.flush();
  101.       return this.fieldDeclSW.getBuffer();
  102.    }
  103.  
  104.    public StringBuffer getMethodBuffer() {
  105.       this.methodDeclPW.flush();
  106.       return this.methodDeclSW.getBuffer();
  107.    }
  108.  
  109.    public StringBuffer getInitializerBuffer() {
  110.       this.initializerPW.flush();
  111.       return this.initializerSW.getBuffer();
  112.    }
  113.  
  114.    public StringBuffer getConstructorBuffer() {
  115.       this.constructorPW.flush();
  116.       return this.constructorSW.getBuffer();
  117.    }
  118.  
  119.    public StringBuffer getServiceMethodBuffer() {
  120.       this.serviceMethodPW.flush();
  121.       return this.serviceMethodSW.getBuffer();
  122.    }
  123.  
  124.    public void setFinalServiceMethodStatement(ObjInfo var1) {
  125.       this.finalStatementInfo = var1;
  126.    }
  127.  
  128.    public ObjInfo getFinalServiceMethodStatement() {
  129.       return this.finalStatementInfo;
  130.    }
  131.  
  132.    public void putSymbol(String var1, ObjInfo var2) {
  133.       this.symbolTable.put(var1, var2);
  134.    }
  135.  
  136.    public ObjInfo getSymbol(String var1) {
  137.       ObjInfo var2 = (ObjInfo)this.symbolTable.get(var1);
  138.       if (var2 == null && this.parent != null) {
  139.          var2 = this.parent.getSymbol(var1);
  140.       }
  141.  
  142.       return var2;
  143.    }
  144.  
  145.    public void clearSymbolTable() {
  146.       this.symbolTable = new Hashtable();
  147.       this.symbolTableStack = new Stack();
  148.       this.symbolTableStack.push(this.symbolTable);
  149.       this.usedSymbolIndices = new Hashtable();
  150.    }
  151.  
  152.    public void pushSymbolTable() {
  153.       this.symbolTable = (Hashtable)this.symbolTableStack.push(new ScriptSymbolTable(this.symbolTable));
  154.    }
  155.  
  156.    public void popSymbolTable() {
  157.       this.symbolTableStack.pop();
  158.       this.symbolTable = (Hashtable)this.symbolTableStack.peek();
  159.    }
  160.  
  161.    public boolean symbolTableIsStacked() {
  162.       return this.symbolTable instanceof ScriptSymbolTable;
  163.    }
  164.  
  165.    private void appendIfNecessary(PrintWriter var1, StringBuffer var2) {
  166.       if (var2.length() > 0) {
  167.          var1.print(var2.toString());
  168.       }
  169.  
  170.    }
  171.  
  172.    public void merge(CodeBuffer var1) {
  173.       Vector var2 = var1.getImports();
  174.  
  175.       for(int var3 = 0; var3 < var2.size(); ++var3) {
  176.          this.addImport((String)var2.elementAt(var3));
  177.       }
  178.  
  179.       this.appendIfNecessary(this.fieldDeclPW, var1.getFieldBuffer());
  180.       this.appendIfNecessary(this.methodDeclPW, var1.getMethodBuffer());
  181.       this.appendIfNecessary(this.initializerPW, var1.getInitializerBuffer());
  182.       this.appendIfNecessary(this.constructorPW, var1.getConstructorBuffer());
  183.       this.appendIfNecessary(this.serviceMethodPW, var1.getServiceMethodBuffer());
  184.       ObjInfo var4 = this.getFinalServiceMethodStatement();
  185.       if (var4 != null && var4.isExecutable()) {
  186.          this.addServiceMethodStatement(var4.objName + ";");
  187.       }
  188.  
  189.       this.setFinalServiceMethodStatement(var1.getFinalServiceMethodStatement());
  190.    }
  191.  
  192.    public void addImport(String var1) {
  193.       if (!this.imports.contains(var1)) {
  194.          this.imports.addElement(var1);
  195.       }
  196.  
  197.    }
  198.  
  199.    public Vector getImports() {
  200.       return this.imports;
  201.    }
  202.  
  203.    public void setPackageName(String var1) {
  204.       this.packageName = var1;
  205.    }
  206.  
  207.    public String getPackageName() {
  208.       return this.packageName;
  209.    }
  210.  
  211.    public void setClassName(String var1) {
  212.       this.className = var1;
  213.    }
  214.  
  215.    public String getClassName() {
  216.       return this.className;
  217.    }
  218.  
  219.    public void setServiceMethodName(String var1) {
  220.       this.serviceMethodName = var1;
  221.    }
  222.  
  223.    public String getServiceMethodName() {
  224.       return this.serviceMethodName;
  225.    }
  226.  
  227.    public void addConstructorArgument(ObjInfo var1) {
  228.       this.constructorArguments.addElement(var1);
  229.    }
  230.  
  231.    public Vector getConstructorArguments() {
  232.       return this.constructorArguments;
  233.    }
  234.  
  235.    public void addConstructorException(String var1) {
  236.       if (!this.constructorExceptions.contains(var1)) {
  237.          this.constructorExceptions.addElement(var1);
  238.       }
  239.  
  240.    }
  241.  
  242.    public Vector getConstructorExceptions() {
  243.       return this.constructorExceptions;
  244.    }
  245.  
  246.    public void addServiceMethodException(String var1) {
  247.       if (!this.serviceMethodExceptions.contains(var1)) {
  248.          this.serviceMethodExceptions.addElement(var1);
  249.       }
  250.  
  251.    }
  252.  
  253.    public Vector getServiceMethodExceptions() {
  254.       return this.serviceMethodExceptions;
  255.    }
  256.  
  257.    public void setExtends(String var1) {
  258.       this.extendsName = var1;
  259.    }
  260.  
  261.    public String getExtends() {
  262.       return this.extendsName;
  263.    }
  264.  
  265.    public void addImplements(String var1) {
  266.       if (!this.implementsVector.contains(var1)) {
  267.          this.implementsVector.addElement(var1);
  268.       }
  269.  
  270.    }
  271.  
  272.    public Vector getImplements() {
  273.       return this.implementsVector;
  274.    }
  275.  
  276.    public void setServiceMethodReturnType(Class var1) {
  277.       this.serviceMethodReturnType = var1;
  278.    }
  279.  
  280.    public Class getServiceMethodReturnType() {
  281.       if (this.finalStatementInfo != null) {
  282.          return this.finalStatementInfo.objClass;
  283.       } else {
  284.          return this.serviceMethodReturnType != null ? this.serviceMethodReturnType : Void.TYPE;
  285.       }
  286.    }
  287.  
  288.    public void print(PrintWriter var1, boolean var2) {
  289.       if (var2) {
  290.          (new CodeFormatter()).formatCode(new StringReader(this.toString()), var1);
  291.       } else {
  292.          var1.print(this.toString());
  293.       }
  294.  
  295.       var1.flush();
  296.    }
  297.  
  298.    public String toString() {
  299.       StringWriter var1 = new StringWriter();
  300.       PrintWriter var2 = new PrintWriter(var1);
  301.       ObjInfo var3 = this.finalStatementInfo;
  302.       if (this.packageName != null && !this.packageName.equals("")) {
  303.          var2.println("package " + this.packageName + ";");
  304.          var2.println();
  305.       }
  306.  
  307.       if (this.imports.size() > 0) {
  308.          for(int var4 = 0; var4 < this.imports.size(); ++var4) {
  309.             var2.println("import " + this.imports.elementAt(var4) + ";");
  310.          }
  311.  
  312.          var2.println();
  313.       }
  314.  
  315.       var2.println("public class " + this.className + (this.extendsName != null && !this.extendsName.equals("") ? " extends " + this.extendsName : "") + (this.implementsVector.size() > 0 ? " implements " + StringUtils.getCommaListFromVector(this.implementsVector) : ""));
  316.       var2.println("{");
  317.       var2.print(this.getFieldBuffer().toString());
  318.       StringBuffer var5 = this.getInitializerBuffer();
  319.       if (var5.length() > 0) {
  320.          var2.println();
  321.          var2.println("{");
  322.          var2.print(var5.toString());
  323.          var2.println("}");
  324.       }
  325.  
  326.       var5 = this.getConstructorBuffer();
  327.       if (var5.length() > 0) {
  328.          var2.println();
  329.          var2.println("public " + this.className + "(" + (this.constructorArguments.size() > 0 ? StringUtils.getCommaListFromVector(this.constructorArguments) : "") + ")" + (this.constructorExceptions.size() > 0 ? " throws " + StringUtils.getCommaListFromVector(this.constructorExceptions) : ""));
  330.          var2.println("{");
  331.          var2.print(var5.toString());
  332.          var2.println("}");
  333.       }
  334.  
  335.       var5 = this.getServiceMethodBuffer();
  336.       if (var5.length() > 0 || var3 != null) {
  337.          var2.println();
  338.          var2.println("public " + StringUtils.getClassName(this.getServiceMethodReturnType()) + " " + this.serviceMethodName + "()" + (this.serviceMethodExceptions.size() > 0 ? " throws " + StringUtils.getCommaListFromVector(this.serviceMethodExceptions) : ""));
  339.          var2.println("{");
  340.          var2.print(var5.toString());
  341.          if (var3 != null) {
  342.             if (var3.isValueReturning()) {
  343.                var2.println();
  344.                var2.println("return " + var3.objName + ";");
  345.             } else if (var3.isExecutable()) {
  346.                var2.println(var3.objName + ";");
  347.             }
  348.          }
  349.  
  350.          var2.println("}");
  351.       }
  352.  
  353.       var2.print(this.getMethodBuffer().toString());
  354.       var2.println("}");
  355.       var2.flush();
  356.       return var1.toString();
  357.    }
  358.  
  359.    public void setSymbolTable(Hashtable var1) {
  360.       this.symbolTable = var1;
  361.    }
  362.  
  363.    public Hashtable getSymbolTable() {
  364.       return this.symbolTable;
  365.    }
  366.  
  367.    Integer getSymbolIndex(String var1) {
  368.       return this.parent != null ? this.parent.getSymbolIndex(var1) : (Integer)this.usedSymbolIndices.get(var1);
  369.    }
  370.  
  371.    void putSymbolIndex(String var1, Integer var2) {
  372.       if (this.parent != null) {
  373.          this.parent.putSymbolIndex(var1, var2);
  374.       } else {
  375.          this.usedSymbolIndices.put(var1, var2);
  376.       }
  377.    }
  378.  
  379.    public String buildNewSymbol(String var1) {
  380.       Integer var2 = this.getSymbolIndex(var1);
  381.       if (var2 == null) {
  382.          var2 = new Integer(0);
  383.       }
  384.  
  385.       int var3 = var2;
  386.  
  387.       String var4;
  388.       for(var4 = var1 + "_" + var3; this.getSymbol(var4) != null; var4 = var1 + "_" + var3) {
  389.          ++var3;
  390.       }
  391.  
  392.       this.putSymbolIndex(var1, new Integer(var3 + 1));
  393.       return var4;
  394.    }
  395. }
  396.